﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading.Tasks;

namespace RagSharpCore.Service;
public class QwenService : IDisposable
{
	private readonly HttpClient _httpClient;
	private readonly string _llmUrl = "http://10.193.40.9:8098/v1/chat/completions";
	private readonly string _llmName = "Qwen3";
	private bool _disposedValue; // 用于检测重复调用Dispose

	// 初始化HttpClient（建议在应用启动时创建一次，避免频繁销毁）
	public QwenService(string QwenUrl = "", string QwenName = "")
	{
		if (QwenUrl != "") this._llmUrl = QwenUrl;
		if (QwenName != "") this._llmName = QwenName;

		_httpClient = new HttpClient();
		// 设置超时时间（根据服务响应速度调整）
		_httpClient.Timeout = TimeSpan.FromSeconds(30);
		// 设置默认请求头（如Content-Type）
		_httpClient.DefaultRequestHeaders.Accept.Add(
			new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(
				"application/json")
		);
	}
	 
	public async Task<string> RequestQwenAsync(
		string prompt ,
		string systemMessage= "默认系统消息")
	{
		string defaultRes = "";
		try
		{
			// 初始化服务类
			var service = new QwenRequestBuilder(this._llmName, systemMessage); 
			// 构建请求数据
			var requestBody = service.BuildRequestData(prompt );

			// 如果需要自定义系统消息
			//var requestData2 = service.BuildRequestData(prompts.First(), "自定义系统消息");
			  
			// 2. 序列化请求体为JSON
			string jsonBody = JsonSerializer.Serialize(requestBody, new JsonSerializerOptions
			{
				PropertyNamingPolicy = JsonNamingPolicy.CamelCase  // 匹配JSON的驼峰命名
			});
			using var content =
				new StringContent(jsonBody, Encoding.UTF8, "application/json");
			 
			// 4. 发送POST请求
			HttpResponseMessage response = await _httpClient.PostAsync(_llmUrl, content);

			// 5. 检查响应是否成功（HTTP 200-299）
			var statusCode=response.EnsureSuccessStatusCode().StatusCode; //((int)statusCode.StatusCode)

			// 6. 读取响应内容并反序列化为对象
			string responseJson = await response.Content.ReadAsStringAsync();
			var responseData = JsonSerializer.Deserialize<ResponseData>(
				responseJson,
				new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }
			);

			if (responseData == null) { return defaultRes; }
				string result = responseData.choices.First().message.content;

			return result;
			 
		}
		catch (HttpRequestException ex)
		{
			// 处理HTTP错误（如连接失败、状态码4xx/5xx）
			Console.WriteLine($"HTTP请求失败：{ex.Message}");
			return defaultRes;
		}
		catch (JsonException ex)
		{
			// 处理JSON序列化/反序列化错误
			Console.WriteLine($"JSON解析失败：{ex.Message}");
			return defaultRes;
		}
		catch (Exception ex)
		{
			// 处理其他异常
			Console.WriteLine($"向量化服务调用失败：{ex.Message}");
			return defaultRes;
		}

	}



	// ------------------------------
	// 实现IDisposable接口释放资源（解决CA1001）
	// ------------------------------
	protected virtual void Dispose(bool disposing)
	{
		if (!_disposedValue)
		{
			if (disposing)
			{
				// 释放托管资源（HttpClient）
				_httpClient?.Dispose();
			}

			// 释放非托管资源（如果有）
			_disposedValue = true;
		}
	}
	// 析构函数：用于释放非托管资源（如果有）
	~QwenService()
	{
		Dispose(disposing: false);
	}

	// 公开的Dispose方法，供外部调用
	public void Dispose()
	{
		Dispose(disposing: true);
		GC.SuppressFinalize(this); // 告诉GC不需要再调用析构函数
	}
}



//    result = response["choices"][0]["message"]["content"]
// 所有结构定义在一个外部类中（嵌套类形式）
public class ResponseData
{
	// 最外层的 choices 数组
	[JsonPropertyName("choices")]
	public List<Choice> choices { get; set; } = new List<Choice>();


	// 嵌套类：对应 choices 数组中的元素
	public class Choice
	{
		[JsonPropertyName("message")]
		public Message message { get; set; } = new Message();
		
		// 嵌套类：对应 message 对象
		public class Message
		{
			[JsonPropertyName("content")]
			public string content { get; set; } = string.Empty;
		} 
	}

}
 

// 请求数据主类
// 消息项类（对应 messages 数组中的每个对象）
public class Message
{
	// 角色（system/user/assistant 等）
	public string Role { get; set; }
	// 内容
	public string Content { get; set; }
}
public class RequestData
{
	// 模型名称
	public string Model { get; set; }
	// 消息列表
	public List<Message> Messages { get; set; } = new List<Message>();
}


public class QwenRequestBuilder
{
	// 类的成员变量，对应 Python 中的 self.model_name 和 self.system_message
	private string _modelName;
	private string _systemMessage;

	// 构造函数（示例）
	public QwenRequestBuilder(string modelName, string systemMessage)
	{
		_modelName = modelName;
		_systemMessage = systemMessage;
	}

	// 构建请求数据的方法，对应 Python 的 build_request_data
	public RequestData BuildRequestData(string prompt, string systemMessage = null, params object[] kwargs)
	{
		// 如果未传入 systemMessage，则使用类的默认值
		var finalSystemMessage = systemMessage ?? _systemMessage;

		// 初始化请求数据对象
		var data = new RequestData
		{
			Model = _modelName
		};

		// 添加系统消息（如果存在）
		if (!string.IsNullOrEmpty(finalSystemMessage))
		{
			data.Messages.Add(new Message
			{
				Role = "system",
				Content = finalSystemMessage
			});
		}

		// 添加用户消息
		data.Messages.Add(new Message
		{
			Role = "user",
			Content = prompt
		});

		// 处理额外的关键字参数（如果需要）
		// 例如：可以根据 kwargs 动态添加其他属性
		// 这里根据实际需求扩展

		return data;
	}
}